In Unternehmen werden Datenanalysen intensiv genutzt, um aus Geschäftsdaten wertvolle Einsichten zu gewinnen. Warum nutzen wir als Softwareentwickler Datenanalysen dann nicht auch für unsere eigenen Daten?
In diesem Workshop stelle ich Vorgehen und Best Practices von Software Analytics vor. Wir sehen uns die dazugehörigen Open-Source-Werkzeuge an, mit denen sich Probleme in der Softwareentwicklung zielgerichtet analysieren und kommunizieren lassen.
Im Praxisteil mit Jupyter, pandas, jQAssistant, Neo4j & Co. erarbeiten wir gemeinsam wertvolle Einsichten aus Datenquellen wie Git-Repositories, Performancedaten, Qualitätsberichten oder auch direkt aus dem Programmcode. Wir suchen nach besonders fehleranfälligem Code, erschließen No-Go-Areas in Altanwendungen und priorisieren Aufräumarbeiten entlang wichtiger Programmteile.
Gerne kann bei diesem interaktiven Workshop direkt mitgearbeitet werden. Ein Notebook mit Internetzugang reicht hierfür völlig aus.
In [1]:
%matplotlib inline
import pandas as pd
Sehr große Auswahl == sehr große Möglichkeiten?
Thomas Zimmermann in "One size does not fit all":
Aber: "... the methods typically are applicable on different datasets."
=> Analyseideen sind wiederverwendbar!
Individuelle Systeme == Individuelle Probleme => Individuelle Analysen => Individuelle Erkenntnisse!
"Statistics on a Mac."
=> Belastbare Erkenntnisse mittels Fakten liefern
=> Neue Erkenntnisse verständlich herausarbeiten
In [2]:
pd.read_csv("../datasets/google_trends_datascience.csv").plot();
"100" == max. Beliebtheit!
Nicht so weit weg wie gedacht!
=> von der Frage über die Daten zur Erkenntnis!
Vehikel: Computational notebooks
https://www.feststelltaste.de/category/top5/
Kurse, Videos, Blogs, Bücher und mehr...
**einige Seiten befinden sich noch in der Entwicklung*
https://github.com/feststelltaste/software-analytics-workshop
Meta-Ziel: Grundmechaniken kennenlernen.
Wir laden einen Datenexport aus einem Git-Repository.
In [3]:
log = pd.read_csv("../datasets/git_log_intellij.csv.gz")
log.head()
Out[3]:
Wir sehen uns Basisinfos über den Datensatz an.
In [4]:
log.info()
1 DataFrame (~ programmierbares Excel-Arbeitsblatt), 6 Series (= Spalten), 1128819 entries (= Reihen)
Wir wandeln die Zeitstempel von Texte in Objekte um.
In [5]:
log['timestamp'] = pd.to_datetime(log['timestamp'])
log.head()
Out[5]:
Wir sehen uns nur die jüngsten Änderungen an.
In [6]:
# use log['timestamp'].max() instead of pd.Timedelta('today') to avoid outdated data in the future
recent = log[log['timestamp'] > log['timestamp'].max() - pd.Timedelta('90 days')]
recent.head()
Out[6]:
Wir wollen nur Java-Code verwenden.
In [7]:
java = recent[recent['filename'].str.endswith(".java")].copy()
java.head()
Out[7]:
Wir zählen die Anzahl der Änderungen je Datei.
In [8]:
changes = java.groupby('filename')[['sha']].count()
changes.head()
Out[8]:
Wir holen Infos über die Code-Zeilen hinzu...
In [9]:
loc = pd.read_csv("../datasets/cloc_intellij.csv.gz", index_col=1)
loc.head()
Out[9]:
...und verschneiden diese mit den vorhandenen Daten.
In [10]:
hotspots = changes.join(loc[['code']]).dropna(subset=['code'])
hotspots.head()
Out[10]:
Wir zeigen nur die TOP 10 Hotspots im Code an.
In [11]:
top10 = hotspots.sort_values(by="sha", ascending=False).head(10)
top10
Out[11]:
Wir erzeugen ein XY-Diagramm aus der TOP 10 Liste.
In [12]:
ax = top10.plot.scatter('sha', 'code');
for k, v in top10.iterrows():
ax.annotate(k.split("/")[-1], v)
vmstat
jdeps
und Visualisierung mit D3
Git
jQAssistant
/ Neo4j
=> von der Frage über die Daten zur Erkenntnis!
GitHub-Repository: https://git.io/Jelju